/*
题目描述
找出一个二维数组中的所有鞍点，即该位置上的元素在该行中最大但是在该列中最小。需要注意有可能鞍点不存在，此时需要输出“NO”。

输入
第一行有2个正整数n和m，表示二维数组的高度和宽度，保证n和m均不超过50。
之后的n行每行有m个用空格隔开的整数，表示二维数组对应位置的值。

输出
当鞍点存在时，将每个鞍点的信息在一行内输出，输出三个用空格隔开的整数，分别为鞍点元素的值以及其所在的行号和列号，有多个鞍点时，按照元素读入的顺序进行输出。当鞍点不存在时，在一行内输出“NO”。
请注意不需要输出引号，并请注意行尾输出换行。
*/
#include <stdio.h>
int main()
{
    int n, m, printed = 0;
    scanf("%d %d", &n, &m);
    int arr[n][m];
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < m; j++)
        {
            scanf("%d", &arr[i][j]);
        }
    }
    for (int i = 0; i < n; i++)
    {
        int maxj = 0;
        for (int j = 0; j < m; j++)
        {
            if (arr[i][j] > arr[i][maxj])
            {
                maxj = j;
            }
        }
        int mini = i;
        int is = 1;
        for (int k = 0; k < n; k++)
        {
            if (arr[k][maxj] < arr[mini][maxj])
            {
                is = 0;
            }
        }
        if (is == 1)
        {
            printed = 1;
            printf("%d %d %d\n", arr[mini][maxj], mini, maxj);
        }
    }
    if (printed == 0)
    {
        printf("NO\n");
    }
}